home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / mig / Mig_GetInfo.c < prev    next >
C/C++ Source or Header  |  1990-06-22  |  4KB  |  144 lines

  1. /* 
  2.  * Mig_GetInfo.c --
  3.  *
  4.  *    Source code for the Mig_GetInfo procedure, which gets migration
  5.  *    and load information for a particular host.  Note: if getting
  6.  *    local information, the "state" of the machine is not guaranteed to
  7.  *    be accurate; this variant is provided just for getting updated load
  8.  *    averages periodically.  
  9.  *
  10.  * Copyright 1990 Regents of the University of California
  11.  * Permission to use, copy, modify, and distribute this
  12.  * software and its documentation for any purpose and without
  13.  * fee is hereby granted, provided that the above copyright
  14.  * notice appear in all copies.  The University of California
  15.  * makes no representations about the suitability of this
  16.  * software for any purpose.  It is provided "as is" without
  17.  * express or implied warranty.
  18.  */
  19.  
  20. #ifndef lint
  21. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_GetInfo.c,v 2.1 90/06/22 14:58:23 douglis Exp $ SPRITE (Berkeley)";
  22. #endif not lint
  23.  
  24. #include <sprite.h>
  25. #include <stdio.h>
  26. #include <mig.h>
  27. #include <kernel/net.h>
  28. #include <errno.h>
  29.  
  30. extern int errno;
  31. extern char *strerror();
  32. extern char *malloc();
  33.  
  34.  
  35. /*
  36.  *----------------------------------------------------------------------
  37.  *
  38.  * Mig_GetInfo --
  39.  *
  40.  *    Get the record for the given host (PROC_MY_HOSTID implies the current
  41.  *     host).
  42.  *
  43.  * Results:
  44.  *    A pointer to a static area (valid until the next call to Mig_GetInfo)
  45.  *    is returned if the call is successful.  On error, NULL is returned.
  46.  *
  47.  * Side effects:
  48.  *    None.
  49.  *
  50.  *----------------------------------------------------------------------
  51.  */
  52.  
  53. #define INFO_BUF_SIZE (2 * sizeof(int) + sizeof(Mig_Info))
  54. Mig_Info *
  55. Mig_GetInfo(hostID)
  56.     int hostID;
  57. {
  58.     int status;
  59.     Mig_InfoRequest request;
  60.     static Mig_Info info;    /* Migration data, returned to user. */
  61.     static char *buffer = NULL;
  62.     int retry = 1;
  63.  
  64.     if (hostID == PROC_MY_HOSTID) {
  65.     if (mig_LocalPdev < 0) {
  66.         if (MigOpenPdev(FALSE) < 0) {
  67.         return((Mig_Info *) NULL);
  68.         }
  69.     }
  70.     while (retry >= 0) {
  71.         status = read(mig_LocalPdev, (char *) &info, sizeof(Mig_Info));
  72.         if (status != sizeof(Mig_Info)) {
  73.         close(mig_LocalPdev);
  74.         mig_LocalPdev = -1;
  75.         if (retry == 0 || MigOpenPdev(FALSE) < 0) {
  76.             fprintf(stderr,
  77.                "Mig_GetInfo: error reading load from migd: %s\n",
  78.                strerror(errno));
  79.             return((Mig_Info *) NULL);
  80.         }
  81.         retry--;
  82.         } else {
  83.         break;
  84.         }
  85.     }
  86.     } else {
  87.     if (mig_GlobalPdev < 0) {
  88.         if (MigOpenPdev(TRUE) < 0) {
  89.         return((Mig_Info *) NULL);
  90.         }
  91.     }
  92.     if (buffer == (char *) NULL) {
  93.         buffer = malloc(INFO_BUF_SIZE);
  94.         if (buffer == (char *) NULL) {
  95.         /*
  96.          * Out of memory?!
  97.          */
  98.         return((Mig_Info *) NULL);
  99.         }
  100.     }
  101.     request.numRecs = 1;
  102.     request.firstHost = hostID;
  103.     while (retry >= 0) {
  104.         if (MigSetAlarm() < 0) {
  105.         fprintf(stderr,
  106.             "Error setting alarm for contact with migd.\n");
  107.         return((Mig_Info *) NULL);
  108.         }
  109.         status = Fs_IOControl(mig_GlobalPdev, IOC_MIG_GETINFO,
  110.                   sizeof(Mig_InfoRequest),
  111.                   (char *) &request,
  112.                   INFO_BUF_SIZE, (char *) buffer);
  113.         if (MigClearAlarm() < 0) {
  114.         fprintf(stderr,
  115.             "Error clearing alarm for contact with migd.\n");
  116.         }
  117.         if (status != SUCCESS) {
  118.         close(mig_GlobalPdev);
  119.         mig_GlobalPdev = -1;
  120.         if (retry == 0 || MigOpenPdev(TRUE) < 0) {
  121.             fprintf(stderr,
  122.                "Mig_GetInfo: error during ioctl to global master: %s\n",
  123.                Stat_GetMsg(status));
  124.             errno = Compat_MapCode(status);
  125.             return((Mig_Info *) NULL);
  126.         }
  127.         retry--;
  128.         } else {
  129.         break;
  130.         }
  131.     }
  132.     if (*((int *) buffer) != 1) {
  133.         fprintf(stderr,
  134.            "Mig_GetInfo: Got %d hosts during ioctl to global master.\n",
  135.            *((int *) buffer));
  136.         return((Mig_Info *) NULL);
  137.     }
  138.     bcopy(buffer + 2 * sizeof(int), (char *) &info,
  139.           sizeof(Mig_Info));
  140.     }
  141.     return(&info);
  142. }
  143.  
  144.